package redis

import (
	"gitee.com/loyalflower/toolkit/config"
	"sync"
	"time"

	"github.com/go-redis/redis"
)

var (
	// redis连接实例列表
	connections map[string]*redis.Client = make(map[string]*redis.Client)
	// redis配置列表
	Configs map[string]Config
	// 全局唯一锁
	onceRedis sync.Once
)

type (
	Config struct {
		// 连接超时时间，默认5秒
		DialTimeout time.Duration `yaml:"dialtimeout"`
		// 连接协议，一般为tcp
		Network string `yaml:"network"`
		// 连接地址，带端口
		Address string `yaml:"address"`
		// 密码，如果没有则为空
		Password string `yaml:"password"`
		// 数据库,没有则默认为0
		Database int `yaml:"database"`
		// 全局唯一锁
		once sync.Once
	}
)

// 根据配置初始化redis连接
func initialization(config Config, instance **redis.Client) {
	*instance = redis.NewClient(&redis.Options{
		Addr:        config.Address,
		Password:    config.Password,
		DB:          config.Database,
		Network:     config.Network,
		DialTimeout: config.DialTimeout,
	})
}

// 根据key名获取redis连接
func Connection(args ...string) *redis.Client {
	var (
		key      string        = "default"
		instance *redis.Client = nil
		success  bool          = false
	)

	if len(args) > 0 {
		key = args[0]
	}

	onceRedis.Do(func() {
		if len(Configs) == 0 {
			config.Get("redis", &Configs)
		}
	})

	if instance, success = connections[key]; success {
		return instance
	}

	if config, success := Configs[key]; success {
		config.once.Do(func() {
			initialization(config, &instance)
			connections[key] = instance
		})
	}

	return instance
}

func InitConfigs(c map[string]Config) {
	if nil == Configs {
		Configs = c
	}
}
